1"=============================================================================="
" __  ____   __ __     _____ __  __ ____   ____
"|  \/  \ \ / / \ \   / /_ _|  \/  |  _ \ / ___|
"| |\/| |\ V /   \ \ / / | || |\/| | |_) | |
"| |  | | | |     \ V /  | || |  | |  _ <| |___
"|_|  |_| |_|      \_/  |___|_|  |_|_| \_\\____|
"=============================================================================="
"" 配置文件位置    ~/.SpaceVim.d/myspacevim.vim
"" 注释：以 " 开头的部分是注释
"=============================================================================="
" 载入用户配置
function! myspacevim#before() abort

	" 启动后自动切换到用户目录下(此处配置用户防止绿色版启动时跑到安装目录)
	execute ":cd  ~"
	set showcmd                  " 在状态栏显示命令状态   
	set backspace=2              " 允许将一行退格到上面一行的结尾

    " 共享剪贴板  匿名寄存器和系统剪贴板互通
    "set clipboard=unnamed  " 寄存器+
    set clipboard=unnamed,unnamedplus " 寄存器*
	" 基础高亮配置
		" 延时禁用让Vim查找/替换后一段时间自动取消高亮，发生查找时自动开启
		" 当光标一段时间保持不动了，就禁用高亮
		autocmd cursorhold * set nohlsearch
		" 当输入查找命令时，再启用高亮
		noremap n :set hlsearch<cr>n
		noremap N :set hlsearch<cr>N
		noremap / :set hlsearch<cr>/
		noremap ? :set hlsearch<cr>?
		noremap * *:set hlsearch<cr>
	
		" 最近行显示高亮配置
		"set cursorline cursorcolumn    " 高亮最近行
		set cursorline nocursorcolumn  " 不高亮最近行
		au WinLeave * set nocursorline nocursorcolumn
		au WinEnter * set cursorline cursorcolumn
	
		" 查找结果高亮显示设置
		" 更多的CTERM颜色可以查阅：http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim
	
		highlight Search ctermbg=yellow ctermfg=black 
		highlight IncSearch ctermbg=black ctermfg=yellow 
		highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE
	
	
	" 查找时大小写敏感配置
		set ignorecase                 " 设置默认进行大小写不敏感查找
		set smartcase                  " 如果有一个大写字母，则切换到大小写敏感查找
	
	" 基础窗口美化设置
		"set nu                        " 可以在每一行的最前面显示行号啦！
		"set list                      " 显示制表格^I、Windows换行符^M,Unix结尾符$
		"set nolist                    " 不显示制表格^I、结尾符$
		"set nowrap                    " 不自动换行    dont wrap lines
		set wrap                      " 自动换行    dont wrap lines

	"设置tab键输入变为4个空格
		"set shiftwidth=4
		"set softtabstop=4
		"set tabstop=4
		"set expandtab
		"set autoindent " 解释：set autoindent Tab键的宽度 当设置成 expandtab 时，缩进用空格来表示，noexpandtab 则是用制表符表示一个缩进。set softtabstop=4 set shiftwidth=4 Tab键的宽度
	
	" 前缀键设置   <leader>键设置 前缀键默认为 " \ ” 
		" 使用:help <leader>命令，可以查看关于前缀键的更多信息
		" 参考资料[VIM学习笔记 前缀键(leader)](https://zhuanlan.zhihu.com/p/63626180)
	
		"将前缀键定义为逗号
		"let mapleader=","  
		" 将前缀键设置为空格键
		"let mapleader = "\<spacer"


	" 代码折叠相关说明与配置
		"set foldmethod=indent  " 设置成 indent 折叠方式（更多的缩进表示更高级别的折叠）
		"set foldcolumn=3       " 命令定义了左折叠栏的宽度，默认是0。该栏用“|”显示折叠层次。
		"set fdm=indent        "set foldmethod=indent的简写 
		" 确认折叠功能开启:set foldenable
		" ：set fdm?      " 参考当前的折叠模式
			" vim 提供 6中折叠方式(默认省缺下为manual手工定义折叠)
			"    manual            手工定义折叠
			"    indent            更多的缩进表示更高级别的折叠
			"    expr              用表达式来定义折叠
			"    syntax            用语法高亮来定义折叠
			"    diff              对没有更改的文本进行折叠
			"    marker            对文中的标志折叠
	
			" manual 模式  ( 手工定义折叠 ）它的命令是通用的，掌握了manual的基本命令，折叠也就差不多
				" za    切换折叠状态，
				" zc    关闭折叠，就是折叠起来，
				" zo    打开折叠，
				" zd    删除折叠，当a、c、d、o大写时，则动作是递归的。
				" zf    创建折叠是zf结合光标移动命令（将光标放在函数的开括号上，用zf%，可方便的将函数折起来）。
				" zr    减少折叠 也就是取消折叠吧标志也取消了
				" zm    折叠更多 
				" zM    减少到一个也不剩
				" zm    折叠更多
				" 举例说明：  
					"    把光标置于某一段落内，并命令模式下键入 zfap 你将会看到该段落被一行高亮的文本所代替。你已经创建一个折叠了。 zf 是个操作符，而 ap 是一个文本对象。
					"    你可以将 zf 操作符跟任何一个移动命令联用，为所经之处的文本创建一个折叠。 (如：zf56G，创建从当前行起到56行的代码折叠；)
					"    zf 也能在可视模式下使用。
	
	
			" indent 模式  ( 更多的缩进表示更高级别的折叠 ）
				"    zi      打开/关闭折叠
				"    zc      折叠
				"    zC      对所在范围内所有嵌套的折叠点进行折叠
				"    zo      展开折叠
				"    zO      对所在范围内所有嵌套的折叠点展开
				"    [z      到当前打开的折叠的开始处。
				"    ]z      到当前打开的折叠的末尾处。
				"    zj      向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
				"    zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。
				"    注：使用时在缩进处输入命令，缩进处需要四个空格或一个Tab键的长度
	
			" marker模式    
				"需要用标计来标识代码的折叠，系统默认是{{{和}}}，最好不要改动之
				" zf  创建折叠，比如在marker方式下：
				"        zf56G，创建从当前行起到56行的代码折叠；
				"        10zf或10zf+或zf10↓，创建从当前行起到后10行的代码折叠。
				"        10zf-或zf10↑，创建从当前行起到之前10行的代码折叠。
				"        在括号处zf%，创建从当前行起到对应的匹配的括号上去（（），{}，[]，等）。
				" zd  删除 (delete) 在光标下的折叠。仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
				" zD  循环删除 (Delete) 光标下的折叠，即嵌套删除折叠。
				"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
				" zE  除去 (Eliminate) 窗口里“所有”的折叠。
				"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
	
			" vim提供4种缩排，:set indenttype? (查看当前缩排)
			" indenttyep可为:
				" autoindent
				" smartindent
				" cindent
				" indentexpr
				" 其中，autoindent与vi的autoindent类似，smartindent则是对其做了点加强，
	
		" 注意，每一种折叠方式不兼容，即：你不能用expr又用marker方式。
		" > 参考资料
		" + [Vim 折叠](https://www.jianshu.com/p/16e0b822b682)
		" + [vim 中代码的折叠和打开](https://blog.csdn.net/woshicsdn7547/article/details/45364047)
		" + [vim的折叠、智慧缩排](https://blog.csdn.net/strategycn/article/details/7897895)

	" 快捷键或命令配置
		"<F2>设置是否显示行号
		" nnoremap <silent> <F2> :set number!<CR>
		" nnoremap <Leader>sn :set number!<CR>  " 显示与隐藏行号
		" nnoremap <Leader>sl :set list!<CR>    " 显示与隐藏制表符与换行符
		" nnoremap <Leader>sw :set wrap!<CR>    " 自动换行与不自动换行
		"使用python3
		"let g:pymode_python = '~/AppData/Local/Programs/Python/Python38-32/python.exe'  
		
endfunction

" 启动函数 VimEnter autocmd后执行
function! myspacevim#after() abort

	"-----------------------------------------------------------------------------
	" 自动动作配置
	" 设置 启动vim时的工作目录
	let g:Source="~"   " 用户目录
	"set autochdir     " 自动切换到当前编辑的文件所在路径 会与NERDTree冲突
	" 手动切换到当前选中文件所在目录路径 :cd %:p:h
	nnoremap <leader>. :cd %:p:h<cr>
	" 打开自动定位到最后编辑的位置, 需要确认.viminfo当前用户可写
	if has("autocmd")
		au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
	endif

	"关闭最后一个文件编辑buffer窗口时，自动退出其余所有NERDTree、Quickfix窗口
	"autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | qa! | endif

	"关闭最后一个文件编辑buffer窗口时，打开 vim-project 面板(需要安装amiorin/vim-project插件)
	"autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Welcome | endif
	
	"关闭最后一个文件编辑buffer窗口时，打开 Startify 面板(需要安装mhinz/vim-startify插件)
	autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Startify | endif


"=============================================================================="
" 自定义函数配置


""""""""""""  自定义函数: 快速输入时间
""""""""""""  

	" --实现方案一, 然后在编辑文件时，在输入模式下，输入 xdate 或 xdatetime 后按回车，便可输入以下格式的时间：
		iab xdate <c-r>=strftime("20%y.%m.%d")<cr> 
		iab xdatetime <c-r>=strftime("20%y/%m/%d %H:%M:%S")<cr> 
		iab xdatetime1 <c-r>=strftime("20%y/%m/%d %H:%M:%S %p (%A) %z")<cr> 

	" --实现方案二, linux系统的命令模式下 :r !date 

	" > 参考资料
	" + [Vim技能修炼教程(15) - 时间和日期相关函数](https://www.jianshu.com/p/172982c0a5f4)
	

	let g:_spacevim_mappings.s = {'name' : '+行号、换行'}
	call SpaceVim#mapping#def('nnoremap', '<Leader>sn', ':set number!<CR>',
	    \ '显示与隐藏行号描述',
	    \ 'set number!',
	    \ '显示与隐藏行号')

	call SpaceVim#mapping#def('nnoremap', '<Leader>sl', ':set list!<CR>',
	    \ '显示与隐藏制表符与换行符描述',
	    \ 'set list!',
	    \ '显示与隐藏制表符与换行符')

	call SpaceVim#mapping#def('nnoremap', '<Leader>sw', ':set wrap!<CR> ',
	    \ '自动换行与不自动换行 描述',
	    \ 'set wrap!',
	    \ '自动换行与不自动换行')

		" nnoremap <Leader>sl :set list!<CR>    " 显示与隐藏制表符与换行符
		" nnoremap <Leader>sw :set wrap!<CR>    " 自动换行与不自动换行


"=============================================================================="
" 插件自定义函数配置
	"let teleport#path = expand('C:\Users\whoami\scoop\apps\z.lua\current\z.lua')
	let teleport#driver = 'z.lua' " skywind3000/z.lua
	
endfunction

"==============================================================================
"" 附：vim的 window 和 Linux 的区别    
	"" -----------------------------------------------------------------------------
	""                    |                          区       别 
	"" -----------------------------------------------------------------------------
	""      系统          |        windows        |        Linux
	"" -----------------------------------------------------------------------------
	""      可视块        |        ctrl+q         |       crtl+v
	""                    | 需要按住shift才能     |
	""                    |        选择块         |
	"" -----------------------------------------------------------------------------
	"" 注释：由于windows下编程习惯了保存就ctrl+s，在vim下ctrl+s整个putty终端就死了，
	""       原来ctrl+s在LINUX里是锁定屏幕的快捷键，解锁ctrl+q就可以了

